package com.sleep.psy.external_server.service.impl;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.utils.IOUtils;
import com.sleep.psy.external_server.service.FileService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

@Service
public class FileServiceImpl implements FileService {

    protected Logger logger = LoggerFactory.getLogger(FileService.class);

    /**
     * 使用规定权限的子账号信息初始化客户端
     * @return
     */
    public COSClient  initClient(String cosRegion){

        String secretId = "AKIDZ1TowrcCalkX8j6GJ9lAzb0CAuRmupZ6";
        String secretKey = "OZXjqkU3PbnuvnniQvEJDvc7c0BAvSuB";
        //cosRegion = "ap-beijing"
        // 1 初始化用户身份信息（secretId, secretKey）。
        // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
        //String secretId = System.getenv("AKIDZ1TowrcCalkX8j6GJ9lAzb0CAuRmupZ6");//用户的 SecretId，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
        //String secretKey = System.getenv("OZXjqkU3PbnuvnniQvEJDvc7c0BAvSuB");//用户的 SecretKey，建议使用子账号密钥，授权遵循最小权限指引，降低使用风险。子账号密钥获取可参见 https://cloud.tencent.com/document/product/598/37140
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的地域, COS 地域的简称请参见 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(cosRegion);
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用 https 协议
        // 从 5.6.54 版本开始，默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);
        return cosClient;
    }

    /**
     * 创建存储桶
     * @return
     */
    public void createBucket(String cosRegion,String bucket){
        COSClient cosClient = initClient(cosRegion);
        //String bucket = "examplebucket-1250000000"; //存储桶名称，格式：BucketName-APPID
        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucket);
        // 设置 bucket 的权限为 Private(私有读写)、其他可选有 PublicRead（公有读私有写）、PublicReadWrite（公有读写）
        createBucketRequest.setCannedAcl(CannedAccessControlList.Private);
        try{
            Bucket bucketResult = cosClient.createBucket(createBucketRequest);
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
        cosClient.shutdown();
    }




    @Override
    public PutObjectResult fileUpload(String cosRegion,String bucketName,String localFilePath,String key){
        COSClient cosClient = initClient(cosRegion);
        // 指定要上传的文件
        File localFile = new File(localFilePath);
        // 指定文件将要存放的存储桶
        //String bucketName = "examplebucket-1250000000";
        // 指定文件上传到 COS 上的路径，即对象键。例如对象键为 folder/picture.jpg，则表示将文件 picture.jpg 上传到 folder 路径下
        //String key = "folder/picture.jpg";
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
        cosClient.shutdown();
        return putObjectResult;
    }

    /**
     * 下载
     * @author wenliguo
     * @date 2025/6/11 10:34
     * @param cosRegion 例：ap-beijing
     * @param bucketName 例：zhongyixinyuan-1302199733
     * @param key 例：sm/user_audio/用户手机号/xx.mp3
     * @return byte[]
     */
    public byte[] getObjectByte(String cosRegion,String bucketName,String key) {
        // 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例，如果没有则创建
        // 详细代码参见本页：简单操作 -> 创建 COSClient
        COSClient cosClient = initClient(cosRegion);
        // 存储桶的命名格式为 BucketName-APPID，此处填写的存储桶名称必须为此格式
        //String bucketName = "examplebucket-1250000000";
        // 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://cloud.tencent.com/document/product/436/13324)
        //String key = "exampleobject";
        GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
        InputStream cosObjectInput = null;
        try {
            COSObject cosObject = cosClient.getObject(getObjectRequest);
            cosObjectInput = cosObject.getObjectContent();
        } catch (CosClientException e) {
            logger.error("下载文件出错", e);
            return null;
        }
        // 处理下载到的流
        // 这里是直接读取，按实际情况来处理
        byte[] bytes;
        try {
            bytes = IOUtils.toByteArray(cosObjectInput);
        } catch (IOException e) {
            logger.error("流转换为流数组出错", e);
            return null;
        } finally {
            // 用完流之后一定要调用 close()
            try {
                cosObjectInput.close();
            } catch (IOException e) {
                logger.error("关闭流出错", e);
            }
        }
        // 在流没有处理完之前，不能关闭 cosClient
        // 确认本进程不再使用 cosClient 实例之后，关闭即可
        cosClient.shutdown();
        return bytes;
    }
}
